Skip to content

feat(discovery): mesh network discovery#5275

Merged
jamesarich merged 32 commits into
release/2.8.0from
feat/discovery
Jun 5, 2026
Merged

feat(discovery): mesh network discovery#5275
jamesarich merged 32 commits into
release/2.8.0from
feat/discovery

Conversation

@jamesarich

@jamesarich jamesarich commented Apr 29, 2026

Copy link
Copy Markdown
Collaborator

Add Local Mesh Discovery feature

  • Introduce a new :feature:discovery module for scanning mesh topology across multiple LoRa presets
  • Add DiscoveryScanEngine to manage scan lifecycles, preset shifting, and packet collection
  • Update database schema to version 39 with tables for discovery sessions, preset results, and discovered nodes
  • Implement UI screens for scan configuration, real-time progress, and historical session management
  • Add flavor-specific discovery maps (Google Maps and OSM) for visualizing node positions and topology
  • Include algorithmic and AI-powered summary generation for analyzing LoRa preset performance
  • Add report export functionality for Text and PDF formats
  • Integrate discovery entry point into the settings screen and navigation graphs

@github-actions github-actions Bot added the enhancement New feature or request label Apr 29, 2026
@jamesarich jamesarich marked this pull request as draft April 29, 2026 02:11
@jamesarich jamesarich changed the title feat(discovery): Local Mesh Discovery Improvements & Bug Fixes feat(discovery): mesh network discovery Apr 29, 2026
@jamesarich jamesarich requested a review from garthvh April 29, 2026 02:15
@jamesarich jamesarich force-pushed the feat/discovery branch 3 times, most recently from 891becc to 0335907 Compare April 30, 2026 13:19
@jamesarich jamesarich added this to the 2.8.0 milestone May 6, 2026
@jamesarich jamesarich force-pushed the feat/discovery branch 2 times, most recently from 515ca60 to 48c58f3 Compare May 20, 2026 22:10
@github-actions

github-actions Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

🖼️ Preview staleness check — advisory

This PR modifies UI composables but does not update any *Previews.kt files.

Previews power screenshot tests and in-app docs screenshots. Keeping them current ensures visual regression coverage stays accurate.

Changed UI files:

feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryHistoryDetailScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryHistoryScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryMapScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryScanScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoverySummaryScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/DwellProgressIndicator.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/PresetPickerCard.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/PresetResultCard.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/RfHealthSection.kt

What to check:

Pattern Preview file convention
feature/{name}/…/ui/ or component/ feature/{name}/…/*Previews.kt
core/ui/…/ core/ui/…/ (previews colocated)

Adding previews checklist:

  1. Create or update a *Previews.kt file in the same module with @PreviewLightDark
  2. Add @Suppress("PreviewPublic") if the preview is consumed by screenshot-tests
  3. Add corresponding @PreviewTest function in screenshot-tests/src/screenshotTest/
  4. Run ./gradlew :screenshot-tests:updateDebugScreenshotTest to generate reference images

If this PR does not require preview updates (e.g., logic-only change, non-visual refactor), add the skip-preview-check label to dismiss.

jamesarich added a commit that referenced this pull request May 30, 2026
Squash merge of PR #5275 into release/2.8.0.

Adds Local Mesh Discovery feature with multi-preset scanning, topology
visualization, and historical session management. Includes DiscoveryScanEngine,
database schema v39 with discovery tables, flavor-specific map views,
and real-time scan progress UI.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jamesarich

Copy link
Copy Markdown
Collaborator Author

🔗 Release 2.8.0 Integration Report

Branch: release/2.8.0 | Status: ✅ Build + all tests passing

Integration Changes Required (Most Extensive)

This PR required the most integration work due to its size (90 files) and touchpoints across database, maps, and service layers.

Database Layer

  1. Room Schema Version → 40 — FTS5 (feat: FTS5 full-text message search #5373) took version 39. Discovery migration rebased to version 40. Created new 40.json schema including both FTS5 tables and discovery tables (discovery_sessions, discovered_nodes, discovery_preset_results).

  2. DiscoveryMigrationTest.kt — Rewrote to test migration path 39→40 (assumes FTS5 is already at 39). Validates all three discovery tables created correctly.

  3. DiscoveryDao.kt — No changes needed; worked cleanly against the version 40 schema.

Map Layer (androidApp flavor sources)

  1. DiscoveryGoogleMap.kt / DiscoveryOsmMap.kt / DiscoveryMarkerChip.kt — These were originally in app/src/ (old module structure). After AIDL removal moved everything to androidApp/src/, these needed relocation. Orphaned duplicates in app/src/ were cleaned up.

  2. DiscoveryMap.kt (both flavors) — Interface updated to use new DiscoveredNodeEntity fields added by the version 40 schema.

Feature Module

  1. DiscoveryScanEngine.kt — After AIDL removal, ServiceRepository.meshPackets became a SharedFlow. Updated packet collection to use the new flow-based API instead of the old callback registration.

  2. DiscoveryPacketCollectionTest.kt / DiscoveryScanEngineTest.kt — Tests adapted for:

    • New FakeServiceRepository constructor
    • Flow-based packet emission instead of callback mocking
    • DiscoveryPacketCollectorRegistry integration with RadioController

DI

  1. FeatureDiscoveryModule.kt — Discovery module now depends on PacketRepository (for FTS5-aware queries) in addition to ServiceRepository. Module declaration updated.

Merge Guidance

  • Merge order: Last (sixth) — depends on FTS5 for schema versioning and AIDL removal for service APIs
  • Prerequisites: feat: FTS5 full-text message search #5373 (FTS5) and refactor: Remove AIDL API and modernize service architecture #5586 (AIDL removal) must merge first
  • Schema coordination: If merging independently (not after FTS5), use version 39 for discovery. If after FTS5, use version 40.
  • Conflict zones: androidApp/src/{google,fdroid}/kotlin/.../map/discovery/ files will conflict with any changes to the map module structure
  • Test command: ./gradlew :feature:discovery:allTests :core:database:allTests

jamesarich added 11 commits May 31, 2026 09:09
* Introduce a new `:feature:discovery` module for scanning mesh topology across multiple LoRa presets
* Add `DiscoveryScanEngine` to manage scan lifecycles, preset shifting, and packet collection
* Update database schema to version 39 with tables for discovery sessions, preset results, and discovered nodes
* Implement UI screens for scan configuration, real-time progress, and historical session management
* Add flavor-specific discovery maps (Google Maps and OSM) for visualizing node positions and topology
* Include algorithmic and AI-powered summary generation for analyzing LoRa preset performance
* Add report export functionality for Text and PDF formats
* Integrate discovery entry point into the settings screen and navigation graphs
…tion restoration

- Implement distance tracking using `latLongToMeter` and a new `getMaxDistance` DAO query
- Calculate Airtime Rate as a delta over time to align with telemetry specifications
- Capture and restore the full `LoRaConfig` instead of just the modem preset after a scan
- Persist local radio statistics (Tx/Rx counts, uptime, relay stats) in preset results
- Backfill missing node names and positions from the local NodeDB during discovery
- Refactor `DiscoveryScanEngine` to use injected `CoroutineDispatchers` and `ApplicationCoroutineScope`
- Reduce BLE connection priority request delay in `BleRadioTransport` to 1 second
- Improve test reliability by replacing fixed `Thread.sleep` calls with state-based polling and `delay`
- Replace platform-specific `String.format` with Kotlin standard library `padStart` in `DwellProgressIndicator` to support common code.
- Simplify fully qualified icon references in `DiscoveryGoogleMap` by adding explicit imports.
…ests

- Add Preparing, Cancelling, Failed states to DiscoveryScanState (FR-008)
- Change Complete to data class with CompletionOutcome enum
- Add local-mesh-discovery deep link routes to DeepLinkRouter (FR-031)
- Compute packetSuccessRate/packetFailureRate in scan engine (FR-012)
- Fix DiscoveryScanEngineTest compilation and restructure with shared scheduler
- All 8 tests pass, kmpSmokeCompile clean
…c heuristic (D029)

Implement the spec's ranking and recommendation heuristic:
1. Highest unique discovered node count
2. Highest neighbor-report diversity (direct + mesh)
3. Highest non-duplicate packet count
4. Best median link quality (SNR first, then RSSI)
5. Greatest best known distance
6. Lowest failure/reconnect penalty
Presets tied after all 6 criteria share the same rank with isTied=true.
Includes RankingScoreBreakdown for transparent per-criterion scoring.
11 unit tests covering each criterion as tiebreaker, full ties,
edge cases (empty/single preset, no nodes, failed presets).
Validated: spotlessApply, allTests, kmpSmokeCompile
Mark 30 of 49 tasks as complete based on code review of the
feat/discovery branch. Key phases completed: setup (P1), data model
(P2 partial), scan engine (P3), packet collection (P4 partial),
map (P5 partial), summary (P6 partial), AI (P7 partial), history (P8).
Remaining: D010-D011 (DAO/migration tests), D012 (prefs), D020
(neighbor info trigger), D023-D024 (tests + map filter), D028
(map UI tests), D030/D032 (summary models + tests), D037 (AI tests),
D042 (history tests), D044-D045/D047-D048 (polish).
- Add rankings StateFlow to DiscoverySummaryViewModel
- Compute rankings from PresetRankingInput on loadNodes and rerunAnalysis
- Pass rank/isTied to PresetResultCard for display
- Show rank badge (#1, #2, tied) in preset header
- Rank 1 (untied) highlighted in primary color
Validated: spotlessApply, allTests, compileKotlinJvm
Add DataStore-backed preferences for discovery scan settings:
- dwellMinutes: persisted dwell time per preset (default 15)
- selectedPresets: last-used preset selection (restored on reopen)
- aiEnabled: whether AI summary expansion is enabled
- topologyOverlayEnabled: map topology overlay default
Architecture:
- Interface: DiscoveryPrefs in core:repository/AppPreferences.kt
- Implementation: DiscoveryPrefsImpl in core:prefs (reuses UiDataStore)
- Fake: FakeDiscoveryPrefs in core:testing
- Wiring: DiscoveryViewModel restores prefs on init, persists on change
Validated: spotlessApply, allTests, compileKotlinJvm
- Use BundledSQLiteDriver in DatabaseBuilder for deterministic SQLite
  behavior across test environments
- Simplify DiscoveryMigrationTest to use context-free inMemoryDatabaseBuilder
  with BundledSQLiteDriver (removes ApplicationProvider dependency)
- Update migration doc comment to reflect version 39→40 path

Found during release/2.8.0 integration testing.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented May 31, 2026

Copy link
Copy Markdown
Contributor

📄 Docs staleness check — advisory

This PR modifies user-facing UI source files but does not update any page under docs/en/user/ or docs/en/developer/.

⚠️ Doc changes propagate to 3 consumers: in-app docs browser, Jekyll site (GitHub Pages), and meshtastic.org (Docusaurus sync). Updating a page in docs/en/ automatically flows to all three.

Changed source files:

core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/CustomColors.kt
core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/util/DiscoveryMapNode.kt
core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/util/LocalDiscoveryMapProvider.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryHistoryDetailScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryHistoryScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryMapScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoveryScanScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/DiscoverySummaryScreen.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/DwellProgressIndicator.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/PresetPickerCard.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/PresetResultCard.kt
feature/discovery/src/commonMain/kotlin/org/meshtastic/feature/discovery/ui/component/RfHealthSection.kt

What to check:

Changed area Likely doc page
feature/messaging/ docs/en/user/messages-and-channels.md
feature/node/ docs/en/user/nodes.md or docs/en/user/node-metrics.md
feature/map/ docs/en/user/map-and-waypoints.md
feature/connections/ docs/en/user/connections.md
feature/settings/ docs/en/user/settings-radio-user.md or docs/en/user/settings-module-admin.md
feature/firmware/ docs/en/user/firmware.md
feature/intro/ docs/en/user/onboarding.md
feature/discovery/ docs/en/user/discovery.md
feature/docs/ Internal docs infrastructure
core/ui/ docs/en/developer/codebase.md or component-specific user pages

New page checklist (if adding a new doc page):

  1. Create the .md file in docs/en/user/ or docs/en/developer/ with last_updated frontmatter
  2. Register in DocBundleLoader.kt with string resources (in-app browser)
  3. Jekyll and Docusaurus sync pick up new pages automatically — no config change needed

If this PR does not require a doc update (e.g., internal refactor, bug fix, test change), add the skip-docs-check label to dismiss this check.

Cross-platform note: This check is advisory while doc coverage matures. Both Android and Apple repos use the same skip-docs-check label and advisory severity. See meshtastic/design standards for shared conventions.

@codecov

codecov Bot commented May 31, 2026

Copy link
Copy Markdown

❌ 9 Tests Failed:

Tests completed Failed Passed Skipped
2541 9 2532 0
View the top 3 failed test(s) by shortest run time
org.meshtastic.core.database.dao.DiscoveryMigrationTest::discoveredNodeEntity_defaultValues
Stack Traces | 0.099s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::deleteSession_cascadesPresetResultsAndNodes
Stack Traces | 0.12s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::getAllSessions_sortedNewestFirst
Stack Traces | 0.133s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::discoverySessionTable_insertAndRetrieve
Stack Traces | 0.143s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::presetResultEntity_defaultValues
Stack Traces | 0.151s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::sessionEntity_defaultValues
Stack Traces | 0.163s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::discoveryPresetResultTable_insertAndRetrieve
Stack Traces | 0.196s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::uniqueNodeCount_deduplicatesAcrossPresets
Stack Traces | 0.243s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
org.meshtastic.core.database.dao.DiscoveryMigrationTest::discoveredNodeTable_insertAndRetrieve
Stack Traces | 18.2s run time
java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at androidx.room3.util.DBUtil__DBUtilKt.performSuspending(DBUtil.kt:47)
	at org.meshtastic.core.database.dao.DiscoveryMigrationTest$discoveredNodeTable_insertAndRetrieve$1.invokeSuspend(DiscoveryMigrationTest.kt:107)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
Caused by: java.lang.UnsatisfiedLinkError: no sqliteJni in java.library.path: .../java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:.../src/androidHostTest/jniLibs
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
	at java.base/java.lang.System.loadLibrary(System.java:2064)
	at androidx.sqlite.driver.bundled.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.android.kt:44)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver$NativeLibraryObject.<clinit>(BundledSQLiteDriver.jvmAndAndroid.kt:129)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:69)
	at androidx.sqlite.driver.bundled.BundledSQLiteDriver.open(BundledSQLiteDriver.jvmAndAndroid.kt:56)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invokeSuspend(ExclusiveMutex.kt:91)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.BaseRoomConnectionManager$openLocked$$inlined$withLock$1.invoke(ExclusiveMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.BaseRoomConnectionManager.openLocked(RoomConnectionManager.kt:367)
	at androidx.room3.BaseRoomConnectionManager.access$openLocked(RoomConnectionManager.kt:38)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invokeSuspend(RoomConnectionManager.kt:64)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.BaseRoomConnectionManager$createConnectionFactory$1.invoke(RoomConnectionManager.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invokeSuspend(ConnectionPoolImpl.kt:273)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquire$newConnection$1.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invokeSuspend(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at androidx.room3.coroutines.ReentrantMutexKt$withReentrantLock$2.invoke(ReentrantMutex.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:43)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:497)
	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
	at androidx.room3.coroutines.ReentrantMutexKt.withReentrantLock(ReentrantMutex.kt:38)
	at androidx.room3.coroutines.Pool.acquire(ConnectionPoolImpl.kt:272)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invokeSuspend(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at androidx.room3.coroutines.Pool$acquireWithTimeout$2.invoke(ConnectionPoolImpl.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatched(Undispatched.kt:66)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:50)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:233)
	at kotlinx.coroutines.TimeoutKt.withTimeout(Timeout.kt:29)
	at kotlinx.coroutines.TimeoutKt.withTimeout-KLykuaI(Timeout.kt:141)
	at androidx.room3.coroutines.Pool.acquireWithTimeout-KLykuaI(ConnectionPoolImpl.kt:236)
	at androidx.room3.coroutines.ConnectionPoolImpl.useConnection(ConnectionPoolImpl.kt:156)
	at androidx.room3.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:99)
	at androidx.room3.RoomDatabase.useConnection(RoomDatabase.android.kt:408)
	at androidx.room3.util.DBUtil__DBUtilKt$performSuspending$2.invokeSuspend(DBUtil.kt:208)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

jamesarich and others added 3 commits May 31, 2026 09:16
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move discovery map files from orphaned app/ to androidApp/ flavors
- Remove duplicate @Suppress annotation in MainActivity
- Fix DeepLinkRouterTest: SettingsGraph -> Settings (renamed on main)
- Fix MeshDataHandlerTest: add missing collectorRegistry parameter
- Remove BundledSQLiteDriver from production DatabaseBuilder (API 26+
  framework SQLite supports FTS5 natively)
- Delete orphaned app/ directory (module renamed to androidApp/)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ve lib

- Add ic_thermostat.xml and ic_person.xml to fdroid res/drawable for
  osmdroid marker icons (moved to compose resources on main)
- Fix spotless formatting in DeepLinkRouterTest
- Add sqlite-bundled-jvm runtimeOnly to core:database androidHostTest
  so BundledSQLiteDriver can load on the host JVM

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jamesarich jamesarich mentioned this pull request Jun 3, 2026
@jamesarich jamesarich changed the base branch from main to release/2.8.0 June 4, 2026 09:33
Resolved conflicts:
- Room schema renumbered v39 -> v42 (FTS5=39, air-quality=40, msh.to=41): version=42,
  AutoMigration(41->42), 3 discovery entities, regenerated 42.json, kept release's 39.json
- MeshtasticDatabase imports: union Discovery{Dao,entities} + DeviceLink{Dao,Entity}
- SettingsScreen / DesktopSettingsScreen: union Discovery + DeviceLinks (+ AppFunctions) entries
- proto pinned to 6b1ded4 (master HEAD); docs: take release/2.8.0

Post-merge API fixups (#5586 AIDL removal):
- DiscoveryScanEngine: RadioController core.model -> core.repository; getPacketId() -> generatePacketId()
- discovery tests: DataPacket.ID_BROADCAST -> NodeAddress.ID_BROADCAST
@jamesarich jamesarich marked this pull request as ready for review June 4, 2026 10:29
@jamesarich jamesarich merged commit 0b3ca59 into release/2.8.0 Jun 5, 2026
15 checks passed
@jamesarich jamesarich deleted the feat/discovery branch June 5, 2026 09:51
jamesarich added a commit that referenced this pull request Jun 10, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 10, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 10, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 10, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 10, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 12, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 12, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 13, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 13, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant